let obj1 = {a: 1, b: [1, 2, 3]}

let str = JSON.stringify(obj1);

let obj2 = JSON.parse(str);

console.log(obj2);   //{a:1,b:[1,2,3]}

obj1.a = 2;

obj1.b.push(4);

console.log(obj1);   //{a:2,b:[1,2,3,4]}

console.log(obj2);   //{a:1,b:[1,2,3]}

/*
使用 JSON.stringify 实现深拷贝还是有一些地方值得注意，我总结下来主要有这几点：

拷贝的对象的值中如果有函数function、undefined、symbol 这几种类型，经过 JSON.stringify 序列化之后的字符串中这个键值对会消失；

拷贝 Date 引用类型会变成字符串；

无法拷贝不可枚举的属性；

无法拷贝对象的原型链；

拷贝 RegExp 引用类型会变成空对象；

对象中含有 NaN、Infinity 以及 -Infinity，JSON 序列化的结果会变成 null；

无法拷贝对象的循环应用，即对象成环 (obj[key] = obj)。
 */


function Obj() {

    this.func = function () {
        alert(1)
    };

    this.obj = {a: 1};
    this.arr = [1, 2, 3];
    this.und = undefined;
    this.reg = /123/;
    this.date = new Date(0);
    this.NaN = NaN;
    this.infinity = Infinity;
    this.sym = Symbol(1);

}

obj1 = new Obj();
//不可枚举的属性，需要将代码粘到浏览器的控制台才能看见
Object.defineProperty(obj1, 'innumerable', {

    enumerable: false,

    value: 'innumerable'

});
console.log('obj1', obj1);

str = JSON.stringify(obj1);
obj2 = JSON.parse(str);

console.log('obj2', obj2);
